package com.hrc.security.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 定义请求的授权规则
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("VIP1")
                .antMatchers("/level2/**").hasRole("VIP2")
                .antMatchers("/level3/**").hasRole("VIP3");
        // 开启自动配置的登录功能
        http.formLogin().usernameParameter("user").passwordParameter("pwd")
                .loginPage("/userlogin");
        // 1. /login请求来到登录页(并且从SpringBoot2.0之后，登录页面自带css样式)
        // 2. 重定向到/login?error表示登录失败
        // 3. 源码规则...
        // 4. 默认post形式的/login代表登录处理
        // 5. 定制了loginPage；那么loginPage的post请求就是登录

        // 开启自动配置的注销功能
        http.logout().logoutSuccessUrl("/"); // 注销成功之后回到首页
        // 1. 相当于访问一个/logout请求，清空session
        // 2. 发送请求之后就会注销该用户，返回到/login?logout页面

        // 开启记住功能
        http.rememberMe().rememberMeParameter("remember");
        // 登录成功之后，会自动创建一个存活时间为14天(没有被注销)的Cookie并将cookie发送给浏览器保存
        // 之后的登录都会带上Cookie，只要通过认证即可免登陆，
        // 点击页面中的注销按钮，便会删除这个Cookie
    }

    // 定义认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1", "VIP2")
                .and()
                .withUser("lisi").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP2", "VIP3")
                .and()
                .withUser("wangwu").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1", "VIP3");
    }
}
